package com.proba.annotations.hibernate;

import java.sql.Timestamp;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.springframework.samples.mvc.basic.izvrsenaRealizacija.IzvrsenaRealizacijaTransformer;
import org.springframework.samples.mvc.basic.izvrsenaRealizacija.IzvrsenaRealizacijaView;

import com.proba.annotations.IzvrsenaRealizacijaDAO;
import com.proba.annotations.pojo.IzvrsenaRealizacija;

public class IzvrsenaRealizacijaHibernateDAO extends
		AbstractHibernateDAO<IzvrsenaRealizacija, Long> implements
		IzvrsenaRealizacijaDAO {

	public List<IzvrsenaRealizacija> findByDatum(Timestamp datum) {
		return findByCriteria(Restrictions.eq("datum", datum));
	}
	
	public List<IzvrsenaRealizacija> findByProizvodenPogon(Long proizvodenPogon) {
		return findByCriteria(Restrictions.eq("proizvodenPogon.id", proizvodenPogon));
	}
	
	public List<IzvrsenaRealizacija> findByPartner(Long partner) {
		return findByCriteria(Restrictions.eq("partner.id", partner));
	}
	
	public List<IzvrsenaRealizacija> findByGotovProizvod(Long gotovProizvod) {
		return findByCriteria(Restrictions.eq("gotovProizvod.id", gotovProizvod));
	}
	
	public List<IzvrsenaRealizacija> findByEksternaRealKolicina(Double eksternaRealKolicina) {
		return findByCriteria(Restrictions.eq("eksternaRealKolicina", eksternaRealKolicina));
	}
	
	public List<IzvrsenaRealizacija> findByEksternaRealIznosDen(Double eksternaRealIznosDen) {
		return findByCriteria(Restrictions.eq("eksternaRealIznosDen", eksternaRealIznosDen));
	}
	
	public List<IzvrsenaRealizacija> findByInternaRealKolicina(Double internaRealKolicina) {
		return findByCriteria(Restrictions.eq("internaRealKolicina", internaRealKolicina));
	}
	
	public List<IzvrsenaRealizacija> findByInternaRealIznosDen(Double internaRealIznosDen) {
		return findByCriteria(Restrictions.eq("internaRealIznosDen", internaRealIznosDen));
	}
	
	public List<IzvrsenaRealizacija> findByZaSopstvenoRealKolicina(Double zaSopstvenoRealKolicina) {
		return findByCriteria(Restrictions.eq("zaSopstvenoRealKolicina", zaSopstvenoRealKolicina));
	}
	
	public List<IzvrsenaRealizacija> findByZaSopstvenoRealIznosDen(Double zaSopstvenoRealIznosDen) {
		return findByCriteria(Restrictions.eq("zaSopstvenoRealIznosDen", zaSopstvenoRealIznosDen));
	}
	
	@Override
	@SuppressWarnings("unchecked")
	public List<IzvrsenaRealizacija> findAll(int startIndex, int pageSize) {
		Criteria crit = getCriteria(startIndex, pageSize);
		crit.addOrder(Order.desc("datum"));
		return crit.list();
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<IzvrsenaRealizacija> findByFilterParams(int startIndex,
			int pageSize, Long id, String datumFrom, String datumTo, String eksternaRealIznosDen,
			String eksternaRealKolicina, String gotovProizvod,
			String internaRealIznosDen, String internaRealKolicina,
			String partner, String proizvodenPogon,
			String zaSopstvenoRealIznosDen, String zaSopstvenoRealKolicina) {
		
		Criteria crit = getCriteria(startIndex, pageSize);
		if (id != null) {
			crit.add(Restrictions.eq("id", id));
			return crit.list();
		}
		if (gotovProizvod != null && !gotovProizvod.isEmpty()) {
			crit.createCriteria("gotovProizvod").add(like("gotovProizvod", gotovProizvod));
		}
		if (partner != null && !partner.isEmpty()) {
			crit.createCriteria("partner").add(like("partner", partner));
		}
		if (proizvodenPogon != null && !proizvodenPogon.isEmpty()) {
			crit.createCriteria("proizvodenPogon").add(like("proizvodenPogon", proizvodenPogon));
		}
		if (notEmpty(datumFrom) && notEmpty(datumTo)) {
			crit.add(Restrictions.between("datum", IzvrsenaRealizacijaTransformer.parseDate(datumFrom), IzvrsenaRealizacijaTransformer.parseDate(datumTo)));
		} else if (notEmpty(datumFrom)) {
			crit.add(Restrictions.ge("datum", IzvrsenaRealizacijaTransformer.parseDate(datumFrom)));
		} else if (notEmpty(datumTo)) {
			crit.add(Restrictions.le("datum", IzvrsenaRealizacijaTransformer.parseDate(datumTo)));
		}
		//TODO Add for the rest
		return crit.list();
	}
	

}
